/**
 * @param {number} a
 * @param {number} b
 * @return {number}
 * @description ^ 是异或运算符 相同为0 不同为1
 *              & 是与运算符 全为1才为1 否则为0 
 *              | 是或运算符 有一个1就为1 否则为0
 *              ~ 是取反运算符 1变0 0变1
 */

var add = function (a, b) {
    // 进位为0时 便不需要计算了
    if (b === 0) {
        return a
    }  
    // 前者为不进位 后者为进位
    return add(a ^ b, (a & b) << 1)
};